package com.huashi.dealer.core.page;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.huashi.dealer.core.util.HttpServletUtil;
import jakarta.servlet.http.HttpServletRequest;

import java.io.BufferedReader;

public class PageFactory {

    /**
     * 每页大小（默认10）
     */
    private static final String PAGE_SIZE_PARAM_NAME = "pageSize";

    /**
     * 第几页（从1开始）
     */
    private static final String PAGE_NO_PARAM_NAME = "pageNo";

    /**
     * 默认分页，在使用时PageFactory.defaultPage会自动获取pageSize和pageNo参数
     *
     */
    public static <T> Page<T> defaultPage() {

        int pageSize = 10;
        int pageNo = 1;

        HttpServletRequest request = HttpServletUtil.getRequest();

        //每页条数
        String pageSizeString = request.getParameter(PAGE_SIZE_PARAM_NAME);
        if (ObjectUtil.isNotEmpty(pageSizeString)) {
            pageSize = Integer.parseInt(pageSizeString);
        }

        //第几页
        String pageNoString = request.getParameter(PAGE_NO_PARAM_NAME);
        if (ObjectUtil.isNotEmpty(pageNoString)) {
            pageNo = Integer.parseInt(pageNoString);
        }

        return new Page<>(pageNo, pageSize);
    }
    /**
     * 从JSON请求体中获取分页参数，默认分页参数
     *
     * @param <T> 泛型类型
     * @return Page 分页对象
     */
    public static <T> Page<T> defaultPageFromJson() {
        int pageSize = 10;
        int pageNo = 1;

        HttpServletRequest request = HttpServletUtil.getRequest();

        try {
            // 获取请求方法
            String method = request.getMethod();

            // 如果是POST请求，尝试从请求体中读取JSON数据
            if ("POST".equalsIgnoreCase(method)) {
                // 获取Content-Type
                String contentType = request.getContentType();

                // 判断是否为JSON请求
                if (contentType != null && contentType.toLowerCase().contains("application/json")) {
                    // 读取请求体
                    String body = null;
                    try {
//                        body = cn.hutool.core.io.IoUtil.readUtf8(request.getReader());
                        StringBuilder sb = new StringBuilder();
                        String line;
                        BufferedReader reader = request.getReader();
                        while ((line = reader.readLine()) != null) {
                            sb.append(line);
                        }
                        body = sb.toString();
                    } catch (Exception e) {
                        // 读取失败时使用默认值
                        body = null;
                    }

                    if (ObjectUtil.isNotEmpty(body)) {
                        // 解析JSON
                        cn.hutool.json.JSONObject jsonObject = cn.hutool.json.JSONUtil.parseObj(body);

                        // 获取pageSize
                        Object pageSizeObj = jsonObject.get(PAGE_SIZE_PARAM_NAME);
                        if (pageSizeObj != null) {
                            pageSize = Integer.parseInt(pageSizeObj.toString());
                        }

                        // 获取pageNo
                        Object pageNoObj = jsonObject.get(PAGE_NO_PARAM_NAME);
                        if (pageNoObj != null) {
                            pageNo = Integer.parseInt(pageNoObj.toString());
                        }
                    }
                } else {
                    // 如果不是JSON请求，回退到默认参数获取方式
                    return defaultPage();
                }
            } else {
                // 如果不是POST请求，回退到默认参数获取方式
                return defaultPage();
            }
        } catch (Exception e) {
            // 发生异常时使用默认值
            pageSize = 10;
            pageNo = 1;
        }

        return new Page<>(pageNo, pageSize);
    }


}
